Kapitel 8 Eine Rechnung in Word
In diesem Kapitel wird das Wissen der vorhergehenden Kapitel verwendet und gezeigt, wie aus Excel alle Namen herausgeholt werden können. Dem Benutzer wird dann die Möglichkeit gegeben, einen davon auszuwählen und eine Rechnung erstellen zu lassen.
Sie erinnern sich: In Kapitel 5 wurde beschrieben, wie in eine Excel-Datei Informationen hineingeschrieben werden. Zwar könnte man an diesem Projekt weiterarbeiten, aber die Gefahr liegt nahe, dass Anforderungen auftreten, die den Code unübersichtlich machen. Wenn ein Projekt in großem Rahmen angelegt wird, stärker wächst als geplant oder es noch weitere, ähnliche Projekte gibt, dann sollten Sie immer objektorientiert denken und arbeiten und eigene Objekte erstellen.
8.1 Die neue Klasse
 
In unserem Beispiel kann das Gerüst bleiben - es wird nur etwas anders organisiert. Der Kaffeeautomat erhält eine Klasse clsDateiZugriff. Da mehrmals die Objekte StreamReader und StreamWriter verwendet werden, wird vor die Zeile
Public Class clsDateizugriff
der folgende Befehl eingefügt:
Imports System.IO
Die Funktion einer Konstanten wird durch eine schreibgeschützte Eigenschaft übernommen. Sie gibt die Zeichenkette »info.txt« zurück:
ReadOnly Property IniDateiname() As String
Get
Return "info.txt"
End Get
End Property
Eine zweite schreibgeschützte Eigenschaft dieses Objekts überprüft, ob diese Datei »info.txt« existiert. Zugegeben, dies habe ich der Methode File.Exists abgesehen. Sie gibt »Wahr« oder »Falsch« zurück und ist folgendermaßen aufgebaut:
ReadOnly Property IniDateiExistiert(ByVal Dateiname As _
String) As Boolean
Get
Dim strWinVerz As String = _
System.Environment.SystemDirectory.ToString
If File.Exists(strWinVerz & "\" & _
Dateiname) = False Then
Return False
Else
Return True
End If
End Get
End Property
Wichtig ist hierbei, dass diese Eigenschaft einen Wert, das heißt den Namen der Datei, erhält. Er wird im Systemverzeichnis gesucht. Falls er dort nicht gefunden wird, wird diese Datei erstellt. Die Befehle sind bekannt - sie wurden ausführlich in Kapitel 5 beschrieben.
Sub IniDateiErstellen()
Dim objDateiMacher As StreamWriter
Dim strWinVerz As String = _
System.Environment.SystemDirectory.ToString
objDateiMacher = New StreamWriter(& _
"\" & strWinVerz)
objDateiMacher.Close()
objDateiMacher = Nothing
End Sub
Später wird der Benutzer nach dem nicht vorhandenen oder falschen Eintrag suchen, der sich in dieser Datei befindet. Er muss dazu in die Ini-Datei geschrieben werden. Man könnte nun eine zweite Methode erstellen - oder (kurz und knapp:) die Methode IniDateiErstellen wird überladen. Das heißt, sie wird ein zweites Mal verwendet. Diesmal wird ihr allerdings ein Parameter (DateinameMitPfad) übergeben, in welchem der Name der Excel-Datei steht. Und dieser Wert wird in die Ini-Datei geschrieben. Das Ergebnis ähnelt der oberen Prozedur, weist allerdings diese beiden Unterschiede auf:
Sub IniDateiErstellen(ByVal DateinameMitPfad As String)
Dim objDateiMacher As StreamWriter
Dim strWinVerz As String = _
System.Environment.SystemDirectory.ToString
objDateiMacher = New StreamWriter(strWinVerz & _
"\" & strWinVerz)
objDateiMacher.Write(DateinameMitPfad)
objDateiMacher.Close()
objDateiMacher = Nothing
End Sub
Schließlich wird noch eine Eigenschaft benötigt, welche den Dateinamen der Excel-Mappe speichert. Er wird aus der Datei herausgeholt, die dieser Eigenschaft übergeben werden muss:
ReadOnly Property ExcelDateiname(ByVal Datei As String) _
As String
Get
Dim objDateiLeser As StreamReader
Try
Dim strExcelDateiname As String
Dim strWinVerz As String = _
System.Environment.SystemDirectory.ToString
objDateiLeser = _
New StreamReader(strWinVerz & "\" & Datei)
strExcelDateiname = objDateiLeser.ReadToEnd
objDateiLeser.Close()
Return strExcelDateiname
Catch ex As EndOfStreamException
MessageBox.Show(ex.Message)
Catch ex As FileNotFoundException
MessageBox.Show(ex.Message)
Exit Property
Finally
objDateiLeser = Nothing
End Try
End Get
End Property
Vielleicht wäre die Try . Catch . End Try-Klammer zum Abfangen möglicher Fehler überflüssig - aber ich möchte auch hier noch einmal darauf hinweisen, dass Fehler in jedem Programm abgefangen werden müssen! Ansonsten ist zu beachten, wo die Variablen deklariert werden. Da objDateiLeser im Finally-Zweig erneut verwendet wird, kann er nicht wie strExcelDateiname und strWinVerz innerhalb der Try-Klammer gesetzt werden.
Zugegeben, als ich mich mit dem Thema objektorientierte Programmierung beschäftigt habe, fand ich das alles schrecklich umständlich. Warum sollte man die Befehle auslagern und warum sollte ich mehr Code für die gleiche Sache schreiben? Eine Antwort ist: Der Code ist leichter veränder- und skalierbar. Sollten nun andere Anforderungen an den Namen oder Speicherort der Ini-Datei gestellt werden, so kann dies schnell in der zugehörigen Eigenschaft modifiziert werden. Und wenn das Projekt wächst, kann mit diesem Klassenobjekt sehr einfach umgegangen werden. Nämlich so:
|